package cn.tedu.reflect;
//测试 暴力反射
//总结：
//1 普通反射 和  暴力反射的区别?---
    //暴力反射可以获取public的甚至private
    //普通反射只能获取public的
//2 怎么使用暴力反射？
  //用对API（getDeclareXxx()）
  //getDeclaredXxx()获取所有资源---只获取自己的方法
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Arrays;

//测试  暴力反射
public class Test3_Person {
    public static void main(String[] args) throws Exception {
        Class p = Person.class;
//        method(p);//暴力反射 成员变量
//        method2(p);// 暴力反射 成员方法
        method3(p);//用暴力反射 执行方法

    }
    public static void method3(Class p) throws Exception{
        Method m = p.getDeclaredMethod("show");
         Object o = p.newInstance();
         m.setAccessible(true);
         m.invoke(o);
    }
    public static void method2(Class p){
        Method[] me = p.getDeclaredMethods();
        for(Method m:me){
            System.out.println(m.getName());
            Class[] c = m.getParameterTypes();
            System.out.println(Arrays.toString(c));
        }
    }
    public static void method(Class p) throws Exception {
        Field[] fs = p.getDeclaredFields();
        for(Field f:fs){
            System.out.println(f.getName());
//            System.out.println(f.getType().getName());
        }
        //只获取一个属性
        Field f = p.getDeclaredField("name");
        Object o = p.newInstance();
//        对私有的属性操作抛出异常：IllegalAccessException
        f.setAccessible(true);//开启私有的访问权限
        f.set(o,"张三");
        f.get(o);
        System.out.println(f.get(o));

    }
}
